package com.chx.three.mama.utils;

/**
 * Created by Casio on 2015/2/6.
 */

import android.graphics.Bitmap;
import android.os.Build;
import android.support.v4.util.LruCache;
import android.util.Log;

import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.LinkedHashMap;

/**
 * 图盘缓存工具，只进行内存图片的管理，如果要进行文件缓存管理，情调用FileCache进行操作。
 */
public class ImageCache {
    private static ImageCache ourInstance;

    public static ImageCache getInstance() {

        if (ourInstance == null) {
            ourInstance = new ImageCache();
        }
        return ourInstance;
    }

    //声明一级缓存，缓存在内存中有固定的大小，如果缓存超过这个大小限制，
    // 删除最旧的的缓存条目，再加新的。一级缓存采用固定内存尺寸的方式存储部分的内容。
    //当内存不足时，就会用 LRU 算法替换掉很少使用，很长时间没有使用的条目
    private LruCache<String,Bitmap> firstCache;
    //声明二级缓存，就直接采用 HashMap 进行存储，存储的对象时SoftReference来引用的对象，
    //HashMap的操作，可以一直添加，当内存不足时，内存回收，因为诶村访问很快

    private HashMap<String,SoftReference<Bitmap>> secondCache;

    private ImageCache() {

        //LruCache最大内存字节数，是当前手机系统可用内存的8分之一，就是当前的缓存在内存中最大占用多少字节
        long freeMemory = Runtime.getRuntime().freeMemory();
        Log.d("YouShare","freeMemory is:"+freeMemory);
        if (freeMemory>0){
            freeMemory=freeMemory/8;
        }else {
            freeMemory=5*1024*1024;
        }
        firstCache=new LruCache<String,Bitmap>((int)freeMemory){

            @Override
            protected int sizeOf(String key, Bitmap value) {

                int size=0;
                //安卓判断版本号
                if (Build.VERSION.SDK_INT>=19){
                    size=value.getAllocationByteCount();
                }else {
                    int rowBytes = value.getRowBytes();//一行的字节数
                    int height = value.getHeight();
                    size=rowBytes*height;//占用空间大小
                }
                Log.d("YouShare","LruCache BitMap Size:"+size);
                return size;
//                return value.getAllocationByteCount();
            }
        };
        secondCache=new LinkedHashMap<String, SoftReference<Bitmap>>();
    }

    /**
     * 获取内存中制定url地址的图片
     * @param url
     * @return
     */
    public Bitmap getImage(String url){

        Bitmap ret = null;
        if (url!=null){
            //先从第一级查找，再从第二级查找
            ret=firstCache.get(url);
            if (ret==null){
                if (secondCache.containsKey(url)){
                    SoftReference<Bitmap> reference = secondCache.get(url);
                    if (reference!=null){
                        ret=reference.get();//获取引用的实际对象
                    }
                }
            }
        }
        return ret;
    }

    public void putImage(String url,Bitmap bitmap){
        //更新内存的缓存
        if (url!=null && bitmap!=null){
            Log.d("YouShare","Put Image Cache:"+url);
            //更新第二级缓存
            secondCache.put(url,new SoftReference<Bitmap>(bitmap));
            //更新第一级缓存
            firstCache.put(url,bitmap);
        }
    }
}
